home *** CD-ROM | disk | FTP | other *** search
/ AMIGA-CD 2 / Amiga-CD - Volume 2.iso / ungepackte_daten / 1993 / 4 / 02 / tips & tricks / makelink.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-06-01  |  3.3 KB  |  126 lines

  1. #include <proto/exec.h>
  2. #include <proto/dos.h>
  3.  
  4. /***********************************************/
  5.  
  6. struct DosLibrary *DOSBase;
  7.  
  8. struct
  9.    {
  10.       char *From;
  11.       char *To;
  12.       long Soft;
  13.       long Force;
  14.    } Arguments;
  15.  
  16. struct FileInfoBlock __aligned FileInfoBlock;
  17. struct RDArgs *RDArgs;
  18. BPTR Dest;
  19.  
  20. char VersionString[]="$VER: MakeLink 1.0 (30.01.93)";
  21.  
  22. /***********************************************/
  23.  
  24. BOOL CheckLoop(void);
  25.  
  26. /***********************************************/
  27.  
  28. int __saveds main(void)
  29.  
  30. {
  31.    int RetVal;
  32.  
  33.    RetVal=0;
  34.    if (DOSBase=(struct DosLibrary *)OpenLibrary("dos.library",37))
  35.       {
  36.          if (RDArgs=ReadArgs("FROM/A,TO/A,SOFT/S,FORCE/S",(long *)&Arguments,NULL))
  37.             {
  38.                if (Dest=Lock(Arguments.To,ACCESS_READ))
  39.                   {
  40.                      if (Examine(Dest,&FileInfoBlock))
  41.                         {
  42.                            if (FileInfoBlock.fib_DirEntryType>0)
  43.                               {
  44.                                  if (!Arguments.Force)
  45.                                     {
  46.                                        VPrintf("Links to directories require use of the FORCE keyword\n",NULL);
  47.                                        RetVal=10;
  48.                                     }
  49.                                  else if (!CheckLoop())
  50.                                     {
  51.                                        RetVal=10;
  52.                                     }
  53.                               }
  54.                            if (!RetVal)
  55.                               {
  56.                                  if (!MakeLink(Arguments.From,(long)(Arguments.Soft ? Arguments.To : Dest),Arguments.Soft))
  57.                                     {
  58.                                        PrintFault(IoErr(),NULL);
  59.                                        RetVal=10;
  60.                                     }
  61.                               }
  62.                         }
  63.                      else
  64.                         {
  65.                            PrintFault(IoErr(),Arguments.To);
  66.                            RetVal=10;
  67.                         }
  68.                      UnLock(Dest);
  69.                   }
  70.                else
  71.                   {
  72.                      PrintFault(IoErr(),Arguments.To);
  73.                      RetVal=10;
  74.                   }
  75.                FreeArgs(RDArgs);
  76.             }
  77.          CloseLibrary(DOSBase);
  78.       }
  79.    else
  80.       {
  81.          RetVal=100;
  82.       }
  83.    return(RetVal);
  84. }
  85.  
  86. /***********************************************/
  87.  
  88. BOOL CheckLoop(void)
  89.  
  90. {
  91.    char *Position;
  92.    BPTR Parent, Source;
  93.    char Saved;
  94.    long Result;
  95.  
  96.    Position=PathPart(Arguments.From);
  97.    Saved=*Position;
  98.    *Position='\0';
  99.    if (Source=Lock(Arguments.From,ACCESS_READ))
  100.       {
  101.          do
  102.             {
  103.                Parent=ParentDir(Source);
  104.                Result=SameLock(Source,Dest);
  105.                UnLock(Source);
  106.                if (Result==LOCK_SAME)
  107.                   {
  108.                      UnLock(Parent);
  109.                      *Position=Saved;
  110.                      VPrintf("Link loop from %s to %s not allowed\n",(long *)&Arguments.From);
  111.                      return(FALSE);
  112.                   }
  113.                Source=Parent;
  114.             }
  115.          while (Source);
  116.       }
  117.    else
  118.       {
  119.          PrintFault(IoErr(),Arguments.From);
  120.          *Position=Saved;
  121.          return(FALSE);
  122.       }
  123.    *Position=Saved;
  124.    return(TRUE);
  125. }
  126.